/*
Script Name: UPDATESUBTASKSTATUS 
This script update the Accela subtasks and workflow tasks statuses when the ePlanSoft assignments are updated. The EPR statuses are listed first and Accela workflow statuses are second in the variables. For example, in line 14 the variable is eprToAccelaStatusMapApproved["Approved"] = "Passed"; the Approved status in ePlanSoft maps to the Accela workflow status Passed.

*/
var SCRIPT_VERSION = 3.0

var eprToAccelaStatusMapApproved= {};
var eprToAccelaStatusMapApprovedWComments= {};
var eprToAccelaStatusMapCorrections= {};
var eprToAccelaStatusMapCanceled = {};

//Approved mappings 
eprToAccelaStatusMapApproved["Approved"] = "Passed";
//eprToAccelaStatusMapApproved["Comment Submitted"] = "Comment Submitted";

//Approved with Comments
eprToAccelaStatusMapApprovedWComments["Approved w Conditions"] = "Passed With Conditions";
//eprToAccelaStatusMapApprovedWComments["Approved w Comments"] = "Approval Letter";

//eprToAccelaStatusMapApprovedWComments["No Comment"] = "No Comment";

// Corrections mappings
eprToAccelaStatusMapCorrections["Corrections Required"] = "Failed";

// Canceled mappings
//eprToAccelaStatusMapCanceled["Canceled"] = "";

var paramRecId = aa.env.getValue("recordId");
var docId = aa.env.getValue("docId");
var paramSubtaskStatus = aa.env.getValue("subtaskStatus");
var taskName = aa.env.getValue("taskName");
var capId = aa.cap.getCapID(paramRecId).getOutput();
var cap = aa.cap.getCap(capId).getOutput();
var taskItem = getTaskItem(taskName);


var rReviewers = aa.document.getRelatedReviewers(parseInt(docId), taskItem.getTaskItem()).getOutput();
if (rReviewers && rReviewers.size() > 0)
{
    var rReviewer = rReviewers.get(0);
    rReviewer.setStatus(paramSubtaskStatus);
    var result = aa.document.updateReviewTask(rReviewer);
    if (result.getSuccess())
		{
        aa.print("Successfully updated review task");
		}
    else
		{
        aa.print("Problem updating review task " + result.getErrorMessage());
		}
}
var ejbProxy = aa.proxyInvoker.newInstance("com.accela.aa.util.EJBProxy").getOutput();
var reviewTasksBiz = ejbProxy.getDocumentEntityAssociationService();
var reviewTasks = reviewTasksBiz.getDocumentReviewTasks(capId, taskItem.getProcessID(), taskItem.getStepNumber());
var iter = reviewTasks.iterator();
var hasActiveTask = false;
var hasApprovedTask = false;
var approvedStatus = null;
var hasApprovedWCommentsTask = false;
var approvedWCommentsStatus = null;
var hasCorrectionsTask = false;
var correctionsStatus = null;
var hasCanceledTask = false;
var canceledStatus = null;

var total = 0;
var systemUserObj = null;

while(iter.hasNext())
{
    reviewTask = iter.next();
  	revStatus = reviewTask.getStatus();
		//aa.print("Checking: "+reviewTask.getTaskName()+" Status "+reviewTask.getTaskStatus());

    if(revStatus == null)
    {
        hasActiveTask = true;
    }
    else
    {
      revStatus = revStatus.split(",");
    	revUser = null;
    	if(revStatus.length == 2)
    	{
        revUser = aa.people.getSysUserByID(revStatus[1]).getOutput();
        systemUserObj = revUser;
        revStatus = revStatus[0];
     	}
	/*	
			aa.print("Status: "+revStatus);
			aa.print("Approved: "+eprToAccelaStatusMapApproved[revStatus]);
			aa.print("ApprovedWComments: "+eprToAccelaStatusMapApprovedWComments[revStatus]);
			aa.print("Corrections: "+eprToAccelaStatusMapCorrections[revStatus]);
			aa.print("Canceled: "+eprToAccelaStatusMapCanceled[revStatus]);
	*/
			if(eprToAccelaStatusMapApproved[revStatus] == undefined && eprToAccelaStatusMapApprovedWComments[revStatus] == undefined && eprToAccelaStatusMapCorrections[revStatus] == undefined && eprToAccelaStatusMapCanceled[revStatus] == undefined)
			{
				hasActiveTask = true;
			}
			else if(eprToAccelaStatusMapApproved[revStatus] != undefined)
			{
				hasApprovedTask = true;
				approvedStatus = eprToAccelaStatusMapApproved[revStatus];
			}
			else if(eprToAccelaStatusMapApprovedWComments[revStatus] != undefined)
			{
				hasApprovedWCommentsTask = true;
				approvedWCommentsStatus = eprToAccelaStatusMapApprovedWComments[revStatus];
			}
			else if(eprToAccelaStatusMapCorrections[revStatus] != undefined)
			{
				hasCorrectionsTask = true;
				correctionsStatus = eprToAccelaStatusMapCorrections[revStatus]; 
			}
			else if(eprToAccelaStatusMapCanceled[revStatus] != undefined)
			{
				hasCanceledTask = true;
				canceledStatus = eprToAccelaStatusMapCanceled[revStatus]; 
			}

    	total++;
    }
}

subtaskStatusS = paramSubtaskStatus.split(",");
subtaskStatus = subtaskStatusS[0];
aa.print("hasActiveSubtasks: "+hasActiveTask);
aa.print("hasRejectedSubtasks: "+hasCorrectionsTask);
aa.print("hasApprovedSubtasks: "+hasApprovedTask);
aa.print("hasApprovedWCommentsSubtasks: "+hasApprovedWCommentsTask);
//aa.print("hasNASubtasks: "+hasNATask);

if(!hasActiveTask)
{
	var uTaskItem = taskItem.getTaskItem();

	if(hasApprovedTask && !hasCorrectionsTask)
 	{
 		aa.print("Setting Workflow Task Status to "+approvedStatus);
		resultWorkflowTask(taskName, approvedStatus, "", "");
	}
	else if(hasApprovedWCommentsTask && !hasCorrectionsTask)
 	{
 		aa.print("Setting Workflow Task Status to "+approvedWCommentsStatus);
		resultWorkflowTask(taskName, approvedWCommentsStatus, "", "");
	}
	else if(hasCorrectionsTask)
 	{
 		aa.print("Setting Workflow Task Status to "+correctionsStatus);
		resultWorkflowTask(taskName, correctionsStatus, "", "");
	}
	else if(hasCanceledTask)
 	{
 		aa.print("Setting Workflow Task Status to "+canceledStatus);
		resultWorkflowTask(taskName, canceledStatus, "", "");
	}
}


try {
	eval(getScriptText("INCLUDES_ACCELA_FUNCTIONS"));
	eval(getScriptText("INCLUDES_ACCELA_GLOBALS"));
	eval(getScriptText("INCLUDES_CUSTOM"));

        capId = aa.cap.getCapID(paramRecId).getOutput();
        cap = aa.cap.getCap(capId).getOutput();

	eval(getScriptText("UPDATESUBTASKSTATUS_CUSTOM"));
}catch(exp){
	aa.print("Error loading custom script "+exp);
}


function getScriptText(vScriptName){
	vScriptName = vScriptName.toUpperCase();
	var emseBiz = aa.proxyInvoker.newInstance("com.accela.aa.emse.emse.EMSEBusiness").getOutput();
	var emseScript = emseBiz.getScriptByPK(aa.getServiceProviderCode(),vScriptName,"ADMIN");
	return emseScript.getScriptText() + "";	
}

function getTaskItem(taskName)
{
    var tItem = aa.workflow.getTaskItems(capId, taskName, null, null, null, null).getOutput() || new Array();
    if (tItem.length > 0)
        return tItem[0];
    else
        return false;
}
function resultWorkflowTask(wfstr, wfstat, wfcomment, wfnote)
{
    var useProcess = false;
    var processName = "";
    if (arguments.length == 5) {
        processName = arguments[4]; // subprocess
        useProcess = true;
    }
    var workflowResult = aa.workflow.getTaskItems(capId, wfstr, processName, null, null, null);
    if (workflowResult.getSuccess())
        var wfObj = workflowResult.getOutput();
    else {
        logMessage("**ERROR: Failed to get workflow object: " + s_capResult.getErrorMessage());
        return false;
    }
    if (!wfstat)
        wfstat = "NA";
    for (i in wfObj) {
        var fTask = wfObj[i];
        if (fTask.getTaskDescription().toUpperCase().equals(wfstr.toUpperCase()) && (!useProcess || fTask.getProcessCode().equals(processName))) {
            var statObj = aa.workflow.getTaskStatus(fTask, wfstat);
            var dispo = "U";
            if (statObj.getSuccess()) {
                var status = statObj.getOutput();
                dispo = status.getResultAction();
            } else {
                aa.print("Could not get status action resulting to no change")
            }
            var dispositionDate = aa.date.getCurrentDate();
            var stepnumber = fTask.getStepNumber();
            var processID = fTask.getProcessID();
            aa.print("Resulting Workflow Task: " + wfstr + " with status " + wfstat);
            if (useProcess)
            {
                var res = aa.workflow.handleDisposition(capId, stepnumber, processID, wfstat, dispositionDate, wfnote, wfcomment, systemUserObj, dispo);
                if(res.getSuccess())
                {
                    aa.print("Updated workflow task successfully");
                }                           
                else
                {
                    aa.print("Error updating workflow task");
            aa.print("ErrorMessage: "+res.getErrorMessage());
            aa.print("ErrorType: "+res.getErrorType());
            aa.print("Output: "+res.getOutput());
                }
            }
            else
            {
                var res = aa.workflow.handleDisposition(capId, stepnumber, wfstat, dispositionDate, wfnote, wfcomment, systemUserObj, dispo);
                if(res.getSuccess())
                {
                    aa.print("Updated workflow task successfully");
                }                           
                else
                {
                    aa.print("Error updating workflow task");
            aa.print("ErrorMessage: "+res.getErrorMessage());
            aa.print("ErrorType: "+res.getErrorType());
            aa.print("Output: "+res.getOutput());
                }
            }
        }
    }
}
function lookup(stdChoice,stdValue) 
{
    var strControl;
    var bizDomScriptResult = aa.bizDomain.getBizDomainByValue(stdChoice,stdValue);
    
    if (bizDomScriptResult.getSuccess())
        {
        var bizDomScriptObj = bizDomScriptResult.getOutput();
        strControl = "" + bizDomScriptObj.getDescription(); // had to do this or it bombs.  who knows why?
        logDebug("lookup(" + stdChoice + "," + stdValue + ") = " + strControl);
        }
    else
        {
        logDebug("lookup(" + stdChoice + "," + stdValue + ") does not exist");
        }
    return strControl;
}
